package edu.uoc.tdp.pac3.client;

import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import java.awt.Font;
import edu.uoc.tdp.pac3.common.GestorEstocInterface;
import edu.uoc.tdp.pac3.tools.TDSLanguageUtils ;
import javax.swing.UIManager;
import java.awt.Toolkit;
import java.awt.SystemColor;
import javax.swing.border.LineBorder;
import java.awt.Color;
import javax.swing.SwingConstants;
import java.awt.BorderLayout;
import javax.swing.ImageIcon;

/**
 * Clase Client 
 * 
 * @author Marcos Rey y Elena Mistou
 */
public class Client extends JFrame {

    private JPanel jContentPane = null;
    
    JMenuBar menuMain = null;
    private JMenu menuInicio = null;
    private JMenuItem menuItem1 = null;
    private JMenuItem menuItem2 = null;
    private JMenu menuOpciones = null;
    private JMenuItem menuOpcItem1 = null;
    private JMenuItem menuOpcItem2 = null;
    private JMenuItem menuOpcItem3 = null;
    private JLabel jlabel1 = null;
    private TDSLanguageUtils literal = null;
    private boolean flag = false;
    private GestorEstocInterface gestorEstoc = null;
    private final String URL = "localhost";
    private final int PORT = 1099;
    private final String JNDI_NAME = "Estocs";
    private JLabel lblTitulo;
    private JLabel lblImagen;
    /**
      * Constructor Client
     */
    public Client() {
        super();
        setIconImage(Toolkit.getDefaultToolkit().getImage(Client.class.getResource("/edu/uoc/tdp/pac3/resources/eassistencia.gif")));
        setResizable(false);
        messagesFile();
        muestraPantalla(1);
        super.setLocationRelativeTo(null);
    }
   
    /**
     * Muestra la pantalla correspondiente 
     * 
     * @return void
     */
    private void muestraPantalla(int pant) {
        int _pant = pant;
        this.setSize(700, 425);
        this.setJMenuBar(getMenu());
        switch (pant) {

            // Pantalla inicial de cliente
            case 1:
                this.setContentPane(getJContentPane());
                break;
                
            case 2:
                PantEntradaEstoc Pnt;
                try {
                   Pnt = new PantEntradaEstoc(gestorEstoc);
                    this.setContentPane(Pnt);
                } catch (RemoteException e) {
                    JOptionPane.showMessageDialog(null,
                            literal.getMessage("client.err.rmi") + "\n" + e.getMessage(),
       
                            literal.getMessage("client.err"), JOptionPane.ERROR_MESSAGE);
                }
                break;
            case 3:
                PantEntradaPeticion Pnt2;
                try {
                    Pnt2 = new PantEntradaPeticion(gestorEstoc);
                    this.setContentPane(Pnt2);
                } catch (RemoteException e) {
                    JOptionPane.showMessageDialog(null,
                            literal.getMessage("client.err.rmi") + "\n" + e.getMessage(),
                            literal.getMessage("client.err"), JOptionPane.ERROR_MESSAGE);
                }
                break;

            case 4:
                PantAceptaPeticion Pnt3;
                try {
                    Pnt3 = new PantAceptaPeticion(gestorEstoc);
                    this.setContentPane(Pnt3);
                } catch (RemoteException e) {
                    JOptionPane.showMessageDialog(null,
                            literal.getMessage("client.err.rmi") + "\n" + e.getMessage(),
                            literal.getMessage("client.err"), JOptionPane.ERROR_MESSAGE);
                }
                break;
        }
        this.setTitle(literal.getMessage("client.title"));              
        getContentPane().setLayout(null);
        setShow();
    }

    /**
     * Comprueba que exista el archivo de mensajes
     * 
     * 
     * @return void
     */
    private void messagesFile() {
        //           
        boolean exist = literal.setDefaultLanguage("i18n/messages");
        if (!exist) {
            System.out.println("No se puede cargar el fichero de mensajes");
            System.exit(-1);
        }
    }

    /**
     * Bloqueja opcions si el client no esta connectat 
     * si esta connectat desbloqueja les opcions
     * 
     * @return void
     */
    private void setShow() {
        if (!flag) {
            menuItem1.setEnabled(true);
            menuOpciones.setEnabled(false);
        } else {
            menuItem1.setEnabled(false);
            menuOpciones.setEnabled(true);
        }
    }

    /**
     * This method muestraPantallas jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();            
            jContentPane.setLayout(null);    
            jContentPane.add(getLblImagen(), BorderLayout.CENTER);
            jContentPane.add(getLblTitulo());
        }
        return jContentPane;
    }

    /**
     * This method muestraPantallas menu	
     * 	
     * @return javax.swing.JMenuBar	
     */
    private JMenuBar getMenu() {
        if (menuMain == null) {
            menuMain = new JMenuBar();
            menuMain.add(getMenuInici());
            menuMain.add(getMenuopciones());
        }
        return menuMain;
    }

    /**
     * This method muestraPantallas menuInici	
     * 	
     * @return javax.swing.JMenu	
     */
    private JMenu getMenuInici() {
        if (menuInicio == null) {
            menuInicio = new JMenu();
            menuInicio.setText(literal.getMessage("client.menu.inici"));
            menuInicio.add(getmenuItem1());
            menuInicio.add(getmenuItem2());
        }
        return menuInicio;
    }

    /**
     * This method muestraPantallas menuTransport	
     * 	
     * @return javax.swing.JMenu	
     */
    private JMenu getMenuopciones() {
        if (menuOpciones == null) {
            menuOpciones = new JMenu();
            menuOpciones.setText(literal.getMessage("client.menu.opciones"));
            menuOpciones.add(getOpcionItem1());
            menuOpciones.add(getOpcionItem2());
            menuOpciones.add(getOpcionItem3());
        }
        return menuOpciones;
    }

    /**
     * This method muestraPantallas menuInici1	
     * 
     * Permite la conexion con el servidor RMI	
     * @return javax.swing.JMenuItem	
     */
    private JMenuItem getmenuItem1() {
        if (menuItem1 == null) {
            menuItem1 = new JMenuItem();
            menuItem1.setText(literal.getMessage("client.menu.inici.item1"));
            menuItem1.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    try {
                        if (gestorEstoc == null) {
                            try {                                
                            	Registry registry = LocateRegistry.getRegistry(URL,PORT);
                            	gestorEstoc = (GestorEstocInterface)registry.lookup(JNDI_NAME);
                                flag = true;
                                setShow();
                            } catch (RemoteException e1) {
                                gestorEstoc = null;
                                JOptionPane.showMessageDialog(null,
                                        literal.getMessage("client.err.conn") + "\n" + e1.getMessage(),
                                        literal.getMessage("client.err"), JOptionPane.ERROR_MESSAGE);
                            } catch (Exception e3) {
                                gestorEstoc = null;
                                JOptionPane.showMessageDialog(null,
                                        literal.getMessage("client.err.conn") + "\n" + e3.getMessage(),
                                        literal.getMessage("client.err"), JOptionPane.ERROR_MESSAGE);
                            }
                        }
                    } catch (Exception eAl) {
                        JOptionPane.showMessageDialog(null,
                                literal.getMessage("client.err.conn") + "\n" + eAl.getMessage(),
                                literal.getMessage("client.err"), JOptionPane.ERROR_MESSAGE);
                    }
                }
            });
        }
        return menuItem1;
    }

    /**
     * This method muestraPantallas menuInici2	
     * 
     * Salir del programa
     * @return javax.swing.JMenuItem	
     */
    private JMenuItem getmenuItem2() {
        if (menuItem2 == null) {
            menuItem2 = new JMenuItem();
            menuItem2.setText(literal.getMessage("client.menu.inici.item2"));
            menuItem2.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    System.exit(0);
                }
            });
        }
        return menuItem2;
    }

    /**
     * This method muestraPantallas menuTransport1	
     *
     * Estado actual de las votaciones 	
     * @return javax.swing.JMenuItem	
     */
    private JMenuItem getOpcionItem1() {
        if (menuOpcItem1 == null) {
            menuOpcItem1 = new JMenuItem();
            menuOpcItem1.setText(literal.getMessage("client.menu.opciones.item1"));
            menuOpcItem1.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    muestraPantalla(2);
                }
            });
        }
        return menuOpcItem1;
    }

    /**
     * This method muestraPantallas menuTransport2	
     * 	
     * Ralizar votacion
     * 
     * @return javax.swing.JMenuItem	
     */
    private JMenuItem getOpcionItem2() {
        if (menuOpcItem2 == null) {
            menuOpcItem2 = new JMenuItem();
            menuOpcItem2.setText(literal.getMessage("client.menu.opciones.item2"));
            menuOpcItem2.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    muestraPantalla(3);
                }
            });
        }
        return menuOpcItem2;
    }

    /**
     * This method muestraPantallas menuTransport3	
     * 	
     * Resultados mejor equipo del a�os
     * 
     * @return javax.swing.JMenuItem	
     */
    private JMenuItem getOpcionItem3() {
        if (menuOpcItem3 == null) {
            menuOpcItem3 = new JMenuItem();
            menuOpcItem3.setText(literal.getMessage("client.menu.opciones.item3"));
            menuOpcItem3.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    muestraPantalla(4);
                }
            });
        }
        return menuOpcItem3;
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
    	try {
    		UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    	} catch (Throwable e) {
    		e.printStackTrace();
    	}
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                Client thisClass = new Client();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

        
	private JLabel getLblTitulo() {
		if (lblTitulo == null) {
			lblTitulo = new JLabel(literal.getMessage("client.text"));
			lblTitulo.setHorizontalAlignment(SwingConstants.CENTER);
			lblTitulo.setFont(new Font("SansSerif", Font.PLAIN, 20));
			lblTitulo.setOpaque(true);
			lblTitulo.setBorder(new LineBorder(new Color(0, 0, 0)));
			lblTitulo.setBackground(SystemColor.textHighlight);
			lblTitulo.setBounds(6, 6, 682, 52);
		}
		return lblTitulo;
	}
	private JLabel getLblImagen() {
		if (lblImagen == null) {
			lblImagen = new JLabel("");
			lblImagen.setBounds(120, 30, 682, 380);
			lblImagen.setIcon(new ImageIcon(Client.class.getResource("/edu/uoc/tdp/pac3/resources/aula.jpg")));
		}
		return lblImagen;
	}
}
